package com.jd.ty.util;



import java.io.File;
import java.util.Properties;
import java.util.UUID;


public class FileUtil {

	/**
	 * 取得不包含路径的文件名
	 * <p>
	 * <b>用法：</b>getFileName("c:\\projects\\temp.log") <br/>
	 * <b>结果： </b>temp.log
	 * </p>
	 * @param filename 包含路径在内的文件名
	 * @return 不包含所在路径的文件名
	 */
	public static String getFileName(String filename) {
		if(filename == null){
			throw new IllegalArgumentException("filename should not be null");
		}
		
		return getFileName(new File(filename));
	}
	
	/**
	 * 取得不包含路径的文件名
	 * <p>
	 * <b>用法：</b>getFileName(new File("c:\\projects\\temp.log")) <br/>
	 * <b>结果： </b>temp.log
	 * </p>
	 * @param file 文件
	 * @return 不包含所在路径的文件名
	 */
	public static String getFileName(File file) {
		if(file == null){
			throw new IllegalArgumentException("file should not be null");
		}
		
		return file.getName();
	}
	
	/**
	 * 取得文件所在完整路径
	 * <p>
	 * <b>用法：</b>getFilePath(new File("c:\\projects\\temp.log")) <br/>
	 * <b>结果： </b>c:\\projects
	 * </p>
	 * @param filename 包含路径在内的文件名
	 * @return 不包含所在路径的文件名
	 */
	public static String getFilePath(String filename) {
		if(filename == null){
			throw new IllegalArgumentException("filename should not be null");
		}
		
		return getFilePath(new File(filename));
	}
	
	/**
	 * 取得文件所在完整路径
	 * <p>
	 * <b>用法：</b>getFilePath(new File("c:\\projects\\temp.log")) <br/>
	 * <b>结果： </b>c:\\projects
	 * </p>
	 * @param file 文件
	 * @return 不包含所在路径的文件名
	 */
	public static String getFilePath(File file) {
		if(file == null){
			throw new IllegalArgumentException("file should not be null");
		}
		
		return file.getParent();
	}
	
	/**
	 * 取得不包含路径和扩展名的文件名
	 * <p>
	 * <b>用法：</b>getFileNameWithoutExtension("temp.log") <br/>
	 * <b>结果： </b>temp
	 * </p>
	 * @param filename 不包含所在路径的文件名
	 * @return 不包含所在路径和扩展名的文件名
	 */
	public static String getFileNameWithoutExtension(String filename) {
		if (filename == null || filename.lastIndexOf(".") == -1) {
			throw new IllegalArgumentException("filename with extension should not be null");
		} 
		
		return filename.substring(0, filename.lastIndexOf("."));
	}
	
	/**
	 * 取得不包含路径和扩展名的文件名
	 * <p>
	 * <b>用法：</b>getFileNameWithoutExtension(new File("c:\\projects\\temp.log")) <br/>
	 * <b>结果： </b>temp
	 * </p>
	 * @param file 文件
	 * @return 不包含所在路径和扩展名的文件名
	 */
	public static String getFileNameWithoutExtension(File file) {
		if(file == null){
			throw new IllegalArgumentException("file should not be null");
		}
		
		return getFileNameWithoutExtension(getFileName(file));
	}
	
	/**
	 * 取得文件名的扩展名
	 * <p>
	 * <b>用法：</b>getFileExtension("c:\\projects\\temp.log") <br/>
	 * <b>结果： </b>log
	 * </p>
	 * @param filename 文件名
	 * @return 文件的扩展名
	 */
	public static String getFileExtension(String filename) {
		if (filename == null) {
			throw new IllegalArgumentException("filename should not be null");
		}
		
		if (filename.lastIndexOf(".") == -1){
			return filename;
		}
		
		return filename.substring(filename.lastIndexOf(".") + 1, filename.length());
	}
	
	/**
	 * 取得文件名的扩展名
	 * <p>
	 * <b>用法：</b>getFileExtension(new File("c:\\projects\\temp.log")) <br/>
	 * <b>结果： </b>log
	 * </p>
	 * @param file 文件
	 * @return 文件的扩展名
	 */
	public static String getFileExtension(File file) {
		String filename = getFileName(file);
		return getFileExtension(filename);
	}

	/**
	 * 替换文件的扩展名
	 * <p>
	 * <b>用法：</b>replaceFileExtension("c:\\projects\\temp.log") <br/>
	 * <b>结果： </b>log
	 * </p>
	 * @param file 文件
	 * @return 替换过扩展名后的文件名（不包含文件所在路径）
	 */
	public static String replaceFileExtension(String filename, String newExtension) {
		if (filename == null || filename.length() == 0) {
			return filename;
		}
		
		if (!newExtension.startsWith(".")){
			newExtension = "." + newExtension;
		}

		return getFileNameWithoutExtension(filename) + newExtension;
	}
	
	/**
	 * 判断文件名是否重复，如果重复则自动在文件名后追加编号生成新文件名
	 * <p>
	 * <b>用法：</b>如果在C盘根目录已经存在temp.log文件，此时又想保存一个同名文件到C盘根目录，
	 * 这种情况可调用此方法getNumberedFileName("c:\\temp.log") <br/>
	 * <b>结果： </b>temp(1).log
	 * </p>
	 * @param filename 包含绝对路径文件名
	 * @param startNum 编号（用于内部递归，外部调用时不需要传入此参数）
	 * @return 包含绝对路径的文件名（文件名已经存在则自动补充编号）
	 */
	public static String getNumberedFileName(String filename, int... startNum) {
		File file = new File(filename);

		if (startNum.length == 0) {
			startNum = new int[1];
			startNum[0] = 0;
		}

		if (file.exists()) {
			startNum[0]++;
			String newFilename = getFileNameWithoutExtension(filename);
			if (newFilename.indexOf("(" + (startNum[0] - 1) + ")") != -1) {
				newFilename = newFilename.substring(0, newFilename.length() - ("(" + (startNum[0] - 1) + ")").length());
			}
			newFilename += "(" + startNum[0] + ")." + getFileExtension(filename);
			return getNumberedFileName(newFilename, startNum[0]);
		} else {
			return filename;
		}
	}
	
	public static void main(String[] args){
		System.out.println(FileUtil.getFilePath(new File("C:/projects/a.htm")));
	}

	/**
	 * @function 生成唯一的临时文件名，并不创建文件
	 * <p>
	 * <b>用法：</b>如果需要生成唯一的文件名，可以调用此方法generateUniqueFileName("c:/temp",  "xls")<br/>
	 * <b>结果： </b>c:/temp/{唯一UUID编号}.xls
	 * </p>
	 * @param path 文件路径
	 * @param ext 后缀名
	 * @return 文件路径+UUID+后缀
	 */
	public static String generateUniqueFileName(String path, String ext){
		Properties p = System.getProperties();
		String separator = p.getProperty("file.separator");

		return path + separator + UUID.randomUUID().toString() + "." + ext;
	}
}
